package fr.charlesen.projets.utt.lo09.sessionBeans;

import fr.charlesen.projets.utt.lo09.entites.Enseignantsuiveur;
import fr.charlesen.projets.utt.lo09.entites.Etudiants;
import fr.charlesen.projets.utt.lo09.entites.Stages;
import fr.charlesen.projets.utt.lo09.facades.EnseignantsuiveurFacadeLocal;
import fr.charlesen.projets.utt.lo09.facades.EtudiantsFacadeLocal;
import fr.charlesen.projets.utt.lo09.facades.StagesFacadeLocal;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Charles EDOU NZE
 */
@Stateless
public class ResponsableDesStages implements ResponsableDesStagesLocal {

    @EJB
    EtudiantsFacadeLocal etudiantFacade;
    @EJB
    StagesFacadeLocal stageFacade;
    @EJB
    EnseignantsuiveurFacadeLocal suiveurFacade;
    private EntityManager em;
    /*
     * ==========================================================*
     * Methodes métiers - Gestion des fonctions de base : F4, F5 *
     * ==========================================================*
     *
     *
     * F4 : affectation d'un stage à un étudiant par le responsable des stages du programme de l'étudiant
     * --------------------------------------------------------------------------------------------------
     *
     * public List<Stages> listStages()
     * ---------------------------------------------
     * Fonctionnalité déja définie dans "ServiceDesStages"
     *
     * public List<Etudiants> listEtuByStageNOK()
     * -------------------------------------------
     * Fonctionnalité déjà définie dans "ProgrammeBoss"
     *
     * public List<Etudiants> listStagesOK()
     * ------------------------------------------
     * Fonctionnalité déja définie dans "ServiceDesStages"
     */

    /*
     * Attribution d'un stage à un étudiant
     * Il est possible qu'un stage soit attribué à plusieurs étudiants
     */
    @Override
    public void attribStage(int idEtu, int idStage) {
        Etudiants etu = etudiantFacade.find(idEtu);
        Stages stage = stageFacade.find(idStage);

        etu.setIdStage(stage);
    }

    /*
     * F5 : attribution d'un suiveur UTT par le responsable des stages du programme
     * ------------------------------------------------------------------------------------
     * Le responsable des stages d'un programme attribue à tous les étudiants de son programme
     * un suiveur UTT parmi la liste des enseignants définie par le responsable du programme.
     */
    // Attribuer à un étudiant du programme un suiveur parmi la liste définie par le responsable du programme
    @Override
    public void attribSuiveur(int idEtu, int idSuiveur) {
        Etudiants etu = etudiantFacade.find(idEtu);
        Enseignantsuiveur suiveur = suiveurFacade.find(idSuiveur);

        etu.setIdSuiveur(suiveur);
    }
    // Visualiser les stages encadrés par un enseignant-chercheur.

    @Override
    public List<Stages> listStagesBySuiveur(int idSuiveur) {
        /*
         * 1) On récupére la liste des stages (idStage) du suiveur dans la table "Etudiants"
         * 2) On renvoi le résultat sous forme de liste d'identifiant de stages.
         */
        Query q = em.createNamedQuery("SELECT id_stage FROM Etudiants e WHERE e.id_suiveur = :id_suiveur");
        return q.setParameter("id_suiveur", idSuiveur).getResultList();
    }

    /*
     * Visualiser la liste des enseignants du programme avec le nombre de stages qui leur ont été attribué.
     * ----------------------------------------------------------------------------------------------------
     * 1) La méthode affichera uniquement les enseignants en fonction du programme
     * 2) L'affichage des stages en fonction de l'enseignant se fera par appel dun autre SessionBeans depuis
     *    l'interface web...
     *
     * La méthode renvoi une liste d'idSuiveur en provenance de la table programme
     */
    @Override
    public List<Enseignantsuiveur> listSuiveurByProgramme(int idProg) {
        Query q = em.createNamedQuery("SELECT id_suiveur FROM Programmes e WHERE e.id = :idProg");
        return q.setParameter("idProg", idProg).getResultList();
    }
}
